//
//  HMHomeTableViewController.swift
//  iOSWeibo11
//
//  Created by Apple on 16/7/18.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit
import SVProgressHUD
import SVPullToRefresh

class HMHomeTableViewController: HMBaseTableViewController {
    private let ReuseIdentifier = "ReuseIdentifier"
    
    /// 微博模型数组
    var statuses: [HMStatus]? {
        didSet {
            // 微博数据发生了改变,让tablView去显示
            self.tableView.reloadData()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // 判断登录后才需要后续的操作
        if !HMUserAccountViewModel.sharedUserAccountViewModel.userLogin {
            // 没有登录
            return
        }
        
        // 显示FPS
        UIApplication.sharedApplication().keyWindow?.showInCenter()
        
        // 登录后才走
        setupNavigationBar()
        self.setupTableView()
        
        // 添加下拉刷新控件
        self.tableView.addSubview(pullDownToRefreshControl)
        
        // 设置下拉刷新时的闭包
        self.pullDownToRefreshControl.refreshingCallback = { () -> Void in
            // 下拉刷新控件进入刷新状态了
            self.loadNewStatus()
        }
        // 自动刷新
        self.pullDownToRefreshControl.beginRefreshing()
        
        // 上拉加载更多,只要设置这个闭包当tableView到最后就会自动进入刷新状态
//        self.tableView.addInfiniteScrollingWithActionHandler { () -> Void in
//            self.loadMoreStatus()
//        }
    }
    
    /// 设置tableView
    private func setupTableView() {
        // 注册cell
        self.tableView.registerClass(HMStatusCell.self, forCellReuseIdentifier: ReuseIdentifier)
        
        // 让tableView的高度自己适应cell里面的内容
//        self.tableView.estimatedRowHeight = 200
        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
    }
    
    /// 显示提示的label
    private func showTipLabel(count: Int) {
        // 动画会叠加
        // UIView动画本质上也是核心动画
        let keys = self.tipLabel.layer.animationKeys()
        if keys != nil {
            // 当前正在动画
            return
        }
        
        let message = count == 0 ? "没有新的微博数据" : "加载了 \(count) 条微博"
        
        self.tipLabel.text = message
        
        UIView.animateWithDuration(1, animations: { () -> Void in
            self.tipLabel.frame.origin.y = 44
            }) { (_) -> Void in
                print("移动下来了")
                
                // 过一会才上去
                UIView.animateWithDuration(1, delay: 0.75, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
                    // 回到屏幕外面去
                    self.tipLabel.frame.origin.y = -64
                    }, completion: nil)
        }
    }
    
    /// 加载新的微博数据
    private func loadNewStatus() {
        // 获取现有微博数据中id最大的微博
        // self.statuses?.first 获取数组中的第一个元素
        // 当第一次进入程序 self.statuses 没有值, since_id = 0,加载最新20条微博数据
        let since_id = self.statuses?.first?.id ?? 0
        
        // 使用ViewModel的方法加载微博数据
        HMStatusViewModel.sharedStatusViewModel.loadStatus(since_id, max_id: 0) { (error, statusModels) -> Void in
            // 网络请求完成了
            // 关闭刷新控件
            self.pullDownToRefreshControl.endRefreshing()
            
            // 判断是否有错误
            if error != nil {
                SVProgressHUD.showErrorWithStatus("获取微博数据失败")
                print("下拉刷新失败原因: \(error)")
                return
            }
            
            // 判断返回的微博数据是否有
            let count = statusModels?.count ?? 0
            
            // 显示下拉刷新条数
            if since_id > 0 {
                // 之前有微博数据,下拉刷新到的数据
                self.showTipLabel(count)
            }
            
            if count == 0 {
                print("没有加载到微博数据")
                return
            }
            
            print("下拉刷新加载到了 \(count) 条微博数据")
            
            // 加载到了微博数据
            if since_id == 0 {
                // 第一次进入程序,加载最新的微博数据
                self.statuses = statusModels
                
                // 在有微博数据之后才需要上拉加载更多
                // 上拉加载更多,只要设置这个闭包当tableView到最后就会自动进入刷新状态
                self.tableView.addInfiniteScrollingWithActionHandler { () -> Void in
                    self.loadMoreStatus()
                }
                
                // 设置自定义的上拉控件
//                let button = UIButton(type: UIButtonType.ContactAdd)
//                self.tableView.infiniteScrollingView.setCustomView(button, forState: 2)
            } else {
                // 之前有微博数据,下拉加载更新的微博
                self.statuses = statusModels! + self.statuses!
            }
        }
    }
    
    /// 加载更多以前微博数据
    private func loadMoreStatus() {
        // 获取当前微博数据中,id最小的微博
        // self.statuses?.last: 获取数组中最后一个元素
        let max_id = self.statuses?.last?.id ?? 0
        
        HMStatusViewModel.sharedStatusViewModel.loadStatus(0, max_id: max_id) { (error, statusModels) -> Void in
            // 请求完成了
            // 关闭刷新控件
            self.tableView.infiniteScrollingView.stopAnimating()
            
            // 判断是否有错误
            if error != nil {
                SVProgressHUD.showErrorWithStatus("上拉加载出错了")
                print("上拉加载出错了: \(error)")
                return
            }
            
            // 加载成功
            let count = statusModels?.count ?? 0
            if count == 0 {
                SVProgressHUD.showInfoWithStatus("没有加载到更多微博数据")
                return
            }
            
            self.statuses = self.statuses! + statusModels!
        }
    }
    
    /// 设置导航栏
    private func setupNavigationBar() {
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch")
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop")
        
        // 获取用户名称
        let screen_name = HMUserAccountViewModel.sharedUserAccountViewModel.userAccount?.screen_name ?? "默认名字"
        let titleButton = HMHomeTitleButton(title: screen_name)
        
        titleButton.addTarget(self, action: "titleButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
        
        self.navigationItem.titleView = titleButton
    }
    
    // MARK: - 按钮点击事件
    @objc private func titleButtonClick(button: UIButton) {
        button.selected = !button.selected
        let transform = button.selected ? CGAffineTransformMakeRotation(CGFloat(M_PI - 0.001)) : CGAffineTransformIdentity
        UIView.animateWithDuration(DefaultAnimtionDuration) { () -> Void in
            button.imageView?.transform = transform
        }
    }
    
    // MARK: - 懒加载
    /// 下拉刷新控件
    private lazy var pullDownToRefreshControl: HMPullDownToRefreshControl = HMPullDownToRefreshControl()
    
    /// 下拉刷新提示label
    private lazy var tipLabel: UILabel = {
        let label = UILabel()
        
        let tipLabelHeight: CGFloat = 44
        
        // 设置
        label.backgroundColor = UIColor.orangeColor()
        label.textAlignment = NSTextAlignment.Center
        label.textColor = UIColor.whiteColor()
        label.font = UIFont.systemFontOfSize(18)
        label.frame = CGRect(x: 0, y: -20 - tipLabelHeight, width: UIScreen.width(), height: tipLabelHeight)
        
        // 测试
//        self.view.addSubview(tipLabel)
//        UIApplication.sharedApplication().keyWindow?.addSubview(tipLabel)
// 添加到导航栏上面
//        self.navigationController?.navigationBar.addSubview(tipLabel)
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        
        return label
    }()
}

// MARK: - tableView数据源方法
extension HMHomeTableViewController {
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        let rowHeight = self.statuses?[indexPath.row].rowHeight ?? 0
//        print("row: \(indexPath.row), rowHeight = \(rowHeight)")
        return rowHeight
    }
    
    /// 返回cell数量
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.statuses?.count ?? 0
    }
    
    /// 返回cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifier) as! HMStatusCell
//        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifier, forIndexPath: indexPath) as! HMStatusCell
        
        // 设置cell的内容
        let status = self.statuses![indexPath.row]
        
        // 给微博cell赋值模型
        cell.status = status
        
        return cell
    }
    
    /// 当用户点击cell后系统会询问我们是否需要高亮这个cell
    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }
}
